from . import passport_blue
from flask import request,current_app,jsonify,make_response,session,render_template
from info.utils.captcha.captcha import captcha
from info import redis_store,constants,db
from info.utils.response_code import RET
import re,random,datetime
from info.models import User
from info.libs.yuntongxun.sms import CCP

@passport_blue.route('/image_code')
def get_image_code():
    # 前端页生成验证码编号，并将编号并提交到后台去请求验证码图片
    # 后台生成图片验证码，并把验证码文字内容当作值，验证码编号当作key存储在redis中
    # 后台把验证码图片当作响应返回给前端
    # 前端申请发送短信验证码的时候带上第1步验证码编号和用户输入的验证码内容
    # 后台取出验证码编号对应的验证码内容与前端传过来的验证码内容进行对比
    # 如果一样，则向指定手机发送验证码，如果不一样，则返回验证码错误
    image_code_id=request.args.get('image_code_id')
    name,text,image=captcha.generate_captcha()
    try:
        # 设置有效时间，把uuid存进去
        redis_store.setex('ImageCode_'+image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='缓存验证码失败')
    resp=make_response(image)
    return resp
    pass

# 发送短信验证码
@passport_blue.route('/smscode',methods=['POST'])
def send_sms():
    mobile=request.json.get('mobile')
    image_code=request.json.get('image_code')
    image_code_id=request.json.get('image_code_id')
    if not all([mobile,image_code,image_code_id]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    if not re.match('1[3456789]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机号格式不正确')
    try:
        real_image_code=redis_store.get('ImageCode_'+image_code_id)
    except Exception  as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='获取验证码失败')
    if not real_image_code:
        return jsonify(errno=RET.NODATA,errmsg='验证码已过期')
    # 删除redis中的缓存的东西
    try:
        redis_store.delete('ImageCode_'+image_code_id)
    except Exception as e:
        current_app.logger.error(e)

    if image_code.lower()!=real_image_code.lower():
        return jsonify(errno=RET.DATAERR,errmsg='验证码不匹配')
    try:
        user=User.query.filter(User.mobile==mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询数据库失败')
    if  user:
        return jsonify(errno=RET.DATAEXIST,errmsg='用户已注册')
    # 生成短信验证码
    result=random.randint(0,999999)
    sms_code='%06d'%result
    print(sms_code)
    # 把短信验证码换存在redis中
    try:
        redis_store.setex('SMSCode_'+mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='缓存短信验证码失败')
    try:
        result = CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], "1")
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='发送信息异常')
    if result==0:
        return jsonify(errno=RET.OK, errmsg='OK')

    else:
        return jsonify(errno=RET.THIRDERR, errmsg='发送验证码失败')
    pass
# 注册
@passport_blue.route('/register',methods=['POST'])
def register():
    '''
    1获取参数
    2.校验参数
    3初始化模型类
    4提交数据库
    :return:
    '''
    mobile=request.json.get('mobile')
    smscode=request.json.get('smscode')
    password=request.json.get('password')
    if not all([mobile,smscode,password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')
    if not re.match('1[3456789]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式不对')
    try:
        real_sms_code=redis_store.get('SMSCode_'+mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取短信验证码失败')
    if not real_sms_code:
        return jsonify(errno=RET.NODATA, errmsg='没有验证码')
    if smscode!=real_sms_code:
        return jsonify(errno=RET.DATAERR, errmsg='验证码错误')
    try:
        user=User.query.filter(User.mobile==mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据库用户失败')
    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg='用户已经注册过')
    user=User()
    user.nick_name=mobile
    user.password=password
    user.mobile=mobile
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='提交数据库失败')
    # 状态保持，设置session
    session['user_id']=user.id
    session['mobile']=user.mobile
    session['nick_name']=user.nick_name
    return jsonify(errno=RET.OK, errmsg='OK')
    pass


# 登陆
@passport_blue.route('/login',methods=['POST'])
def login():
    """
        1. 获取参数和判断是否有值
        2. 从数据库查询出指定的用户
        3. 校验密码
        4. 保存用户登录状态
        5. 返回结果
        :return:
        """
    mobile=request.json.get('mobile')
    password=request.json.get('password')
    if not all([mobile,password]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    if not re.match('1[3456789]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机号错误')
    try:
        user=User.query.filter(User.mobile==mobile).first()
    except Exception  as e :
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据库失败')
    # if not user:
    #     return jsonify(errno=RET.NODATA, errmsg='没有查到数据')
    # if password!=user.password:
    # if user.check_password(password)
    #     return jsonify(errno=RET.PWDERR, errmsg='密码错误')
    if  (not user) or (not user.check_password(password)):
        return jsonify(errno=RET.PWDERR, errmsg='用户名或者密码错误')
    # 保存用户最后登陆时间
    user.last_login=datetime.datetime.now()
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='提交数据库失败')
    session['user_id']=user.id
    session['mobile']=user.mobile
    session['nick_name']=user.nick_name
    return jsonify(errno=RET.OK, errmsg='OK')
    pass
# 登出
@passport_blue.route('/logout')
def logout():
    session.pop('user_id')
    session.pop('mobile')
    session.pop('nick_name')
    return jsonify(errno=RET.OK, errmsg='OK')
    pass